package com.nageoffer.shortlink.project.config;

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 初始化限流配置
 * 使用 Sentinel 实现对资源 create_short-link 的 QPS（每秒请求数）限流 配置
 */
@Component
public class SentinelRuleConfig implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule createOrderRule = new FlowRule();
        createOrderRule.setResource("create_short-link");       // 指定被保护的资源名称
        createOrderRule.setGrade(RuleConstant.FLOW_GRADE_QPS);      // 按照QPS进行限制
        createOrderRule.setCount(20);        // 访问上限（每秒最多访问20）
        rules.add(createOrderRule);         // 添加规则

        // 将规则列表加载到 Sentinel 的规则库中。Sentinel 会在请求进入资源时，通过 FlowSlot 检查规则并执行限流逻辑；
        // 若触发限流，会抛出 FlowException（继承自 BlockException），开发者可捕获该异常自定义处理逻辑
        FlowRuleManager.loadRules(rules);
    }
}